/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package test;

import com.leeall.google.GoogleConstants;
import com.leeall.google.auth.AppsClientLogin;
import com.leeall.jatalk.common.Constants;
import com.leeall.spring.utils.SpringContextLoader;
import com.leeall.utils.string.StringUtil;
import java.awt.Color;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.BorderFactory;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

/**
 *
 * @author Leeall (lixiaosong@gmail.com)
 */
public class CustomDialog extends JDialog implements ActionListener, PropertyChangeListener {

    private String typedText = null;
    private JTextField usernameTextField;
    private JPasswordField passwordTextField;
    private DialogDemo dd;
    private String magicWord;
    private JOptionPane optionPane;
    private String btnString1 = java.util.ResourceBundle.getBundle("i18n/MessagesBundle").getString("Enter");
    private String btnString2 = java.util.ResourceBundle.getBundle("i18n/MessagesBundle").getString("Cancel");

    /**
     * Returns null if the typed string was invalid;
     * otherwise, returns the string as the user entered it.
     */
    public String getValidatedText() {
        return typedText;
    }

    /** Creates the reusable dialog. */
    public CustomDialog(Frame aFrame, String aWord, DialogDemo parent) {
        super(aFrame, true);
        dd = parent;

        magicWord = aWord.toUpperCase();
        setTitle("Quiz");

        usernameTextField = new JTextField();
        passwordTextField = new JPasswordField();

        //Create an array of the text and components to be displayed.
        String msgString1 = java.util.ResourceBundle.getBundle("i18n/MessagesBundle").getString("UserName:");
        String msgString2 = java.util.ResourceBundle.getBundle("i18n/MessagesBundle").getString("Password:");
        Object[] array = {msgString1, msgString2, usernameTextField, passwordTextField};

        //Create an array specifying the number of dialog buttons
        //and their text.
        Object[] options = {btnString1, btnString2};

        //Create the JOptionPane.
        optionPane = new JOptionPane(array,
                JOptionPane.QUESTION_MESSAGE,
                JOptionPane.YES_NO_OPTION,
                null,
                options,
                options[0]);

        //Make this dialog display it.
        setContentPane(optionPane);

        //Handle window closing correctly.
        setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
        addWindowListener(new WindowAdapter() {

            public void windowClosing(WindowEvent we) {
                /*
                 * Instead of directly closing the window,
                 * we're going to change the JOptionPane's
                 * value property.
                 */
                optionPane.setValue(new Integer(
                        JOptionPane.CLOSED_OPTION));
            }
        });

        //Ensure the text field always gets the first focus.
        addComponentListener(new ComponentAdapter() {

            public void componentShown(ComponentEvent ce) {
                usernameTextField.requestFocusInWindow();
            }
        });

        //Register an event handler that puts the text into the option pane.
        usernameTextField.addActionListener(this);
        passwordTextField.addActionListener(this);

        //Register an event handler that reacts to option pane state changes.
        optionPane.addPropertyChangeListener(this);
    }

    /** This method handles events for the text field. */
    public void actionPerformed(ActionEvent e) {
        System.out.println("Hey!We are doing action performed.");
        optionPane.setValue(btnString1);
        this.login();
    }

    /** This method reacts to state changes in the option pane. */
    public void propertyChange(PropertyChangeEvent e) {
        String prop = e.getPropertyName();

        if (isVisible() && (e.getSource() == optionPane) && (JOptionPane.VALUE_PROPERTY.equals(prop) ||
                JOptionPane.INPUT_VALUE_PROPERTY.equals(prop))) {
            Object value = optionPane.getValue();

            if (value == JOptionPane.UNINITIALIZED_VALUE) {
                //ignore reset
                return;
            }

            //Reset the JOptionPane's value.
            //If you don't do this, then if the user
            //presses the same button next time, no
            //property change event will be fired.
            optionPane.setValue(
                    JOptionPane.UNINITIALIZED_VALUE);

            if (btnString1.equals(value)) {
                System.out.println("You have clicked a Enter button.");
                String userName = usernameTextField.getText();
                char[] cs = passwordTextField.getPassword();
                String password = String.valueOf(cs);
                this.login(userName, password);
//                String ucText = typedText.toUpperCase();
//                if (magicWord.equals(ucText)) {
//                    //we're done; clear and dismiss the dialog
//                    clearAndHide();
//                } else {
//                    //text was invalid
//                    textField.selectAll();
//                    JOptionPane.showMessageDialog(
//                            CustomDialog.this,
//                            "Sorry, \"" + typedText + "\" " + "isn't a valid response.\n" + "Please enter " + magicWord + ".",
//                            "Try again",
//                            JOptionPane.ERROR_MESSAGE);
//                    typedText = null;
//                    textField.requestFocusInWindow();
//                }
            } else { //user closed dialog or clicked cancel
                dd.setLabel("It's OK.  " + "We won't force you to type " + magicWord + ".");
                typedText = null;
                clearAndHide();
            }
        }
    }

    /** This method clears the dialog and hides it. */
    public void clearAndHide() {
        setVisible(false);
    }

    /**
     * Loging Action
     * @return  login status
     */
    private boolean login(String userName, String password) {
        boolean status = false;
        if (StringUtil.stringIsEmpty(userName)) {
            this.dd.setLabel(java.util.ResourceBundle.getBundle("i18n/MessagesBundle").getString("Pls_input_your_username"));
            this.usernameTextField.setBorder(BorderFactory.createLineBorder(Color.RED, 2));
            return status;
        } else {
            if (!StringUtil.validateEmail(userName)) {
                this.dd.setLabel(java.util.ResourceBundle.getBundle("i18n/MessagesBundle").getString("Invalid_Email_Address"));
                return status;
            }
        }
        if (StringUtil.stringIsEmpty(password)) {
            this.dd.setLabel(java.util.ResourceBundle.getBundle("i18n/MessagesBundle").getString("Pls_input_your_password"));
            this.passwordTextField.setBorder(BorderFactory.createLineBorder(Color.RED, 2));
            return status;
        }
        try {
            AppsClientLogin appsClientLogin = (AppsClientLogin) SpringContextLoader.getBean("appsClientLogin");
            status = appsClientLogin.login(
                    GoogleConstants.GOOGLE_AUTH_ACCOUNT_TYPE_GOOGLE,
                    userName, password, "cl",
                    Constants.VERSION, "", "");
            if (status) {
                this.dd.setLabel(java.util.ResourceBundle.getBundle("i18n/MessagesBundle").getString("Login_Succeed"));
            } else {
                this.dd.setLabel(java.util.ResourceBundle.getBundle("i18n/MessagesBundle").getString("Login_Failed"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return status;
    }
    
    private boolean login(){
        String userName = this.usernameTextField.getText();
        char[] cs = this.passwordTextField.getPassword();
        String password = String.valueOf(cs);
        return this.login(userName, password);
    }
}
